// Object.defineProperties(Array.prototype, {
//     clear: {
//         writable: !1,
//         enumerable: !1,
//         configurable: !0,
//         value: function () {
//             this.splice(0, this.length);
//         }
//     },
//     clone: {
//         writable: !1,
//         enumerable: !1,
//         configurable: !0,
//         value: function () {
//             return this.slice();
//         }
//     },
//     huoqu_shuzu_zhong_suiji_yige_yuansu: {
//         writable: !1,
//         enumerable: !1,
//         configurable: !0,
//         value: function () {
//             return this[Math.get_random_int(0, this.length)];
//         }
//     },
//     huoqu_shuzu_suiji_zhiding_shuliang_yuansu: {
//         writable: !1,
//         enumerable: !1,
//         configurable: !0,
//         value: function (e) {
//             if (e > this.length) {
//                 console.log("超出数组长度");
//                 return this;
//             }
//             var t;
//             var o;
//             var i = this.slice(0);
//             var n = this.length;
//             for (var a = n - e; n-- > a; ) {
//                 t = i[(o = Math.floor((n + 1) * Math.random()))];
//                 i[o] = i[n];
//                 i[n] = t;
//             }
//             return i.slice(a);
//         }
//     },
//     huoqu_shuzu_suiji_zhiding_shuliang_buchongfu_yuansu: {
//         writable: !1,
//         enumerable: !1,
//         configurable: !0,
//         value: function (e) {
//             var t = this.slice(0);
//             var o = [];
//             var i = t.length;
//             for (var n = 0; n < i; n++) {
//                 var a = Math.floor(Math.random() * t.length);
//                 if (o.indexOf(t[a]) < 0 && (o.push(t[a]), o.length === e)) {
//                     return o;
//                 }
//                 t.splice(a, 1);
//             }
//             console.log("未找到足够数量的元素");
//             return o;
//         }
//     },
//     paichu_zhiding_yuansu_hou_suiji_yuansu: {
//         writable: !1,
//         enumerable: !1,
//         configurable: !0,
//         value: function (e, t) {
//             if (void 0 === t) {
//                 t = 1;
//             }
//             if (!Array.isArray(e)) {
//                 e = [e];
//             }
//             var o = this.filter(function (t) {
//                 return e.indexOf(t) < 0;
//             });
//             return 1 === t ? o.huoqu_shuzu_zhong_suiji_yige_yuansu() : o.huoqu_shuzu_suiji_zhiding_shuliang_yuansu(t);
//         }
//     },
//     paichu_zhiding_suoyin_hou_suiji_yuansu: {
//         writable: !1,
//         enumerable: !1,
//         configurable: !0,
//         value: function (e, t) {
//             if (void 0 === t) {
//                 t = 1;
//             }
//             if (!Array.isArray(exceptId)) {
//                 exceptId = [exceptId];
//             }
//             var o = this.filter(function (e, t) {
//                 return exceptId.indexOf(t) < 0;
//             });
//             return 1 === t ? o.huoqu_shuzu_zhong_suiji_yige_yuansu() : o.huoqu_shuzu_suiji_zhiding_shuliang_yuansu(t);
//         }
//     },
//     hebing_duoge_shuzu: {
//         writable: !1,
//         enumerable: !1,
//         configurable: !0,
//         value: function () {
//             return this.concat.apply(this, arguments);
//         }
//     },
//     insert: {
//         writable: !1,
//         enumerable: !1,
//         configurable: !0,
//         value: function (e, t) {
//             this.splice(e, 0, t);
//         }
//     },
//     removeAt: {
//         writable: !1,
//         enumerable: !1,
//         configurable: !0,
//         value: function (e) {
//             return this.splice(e, 1);
//         }
//     },
//     remove: {
//         writable: !1,
//         enumerable: !1,
//         configurable: !0,
//         value: function () {
//             var e = arguments.length;
//             var t = new Array(e);
//             for (var o = 0; o < e; o++) {
//                 t[o] = arguments[o];
//             }
//             var i = 0;
//             for (var n = t; i < n.length; i++) {
//                 var a = n[i];
//                 var s = this.indexOf(a);
//                 if (s > -1) {
//                     this.removeAt(s);
//                 }
//             }
//         }
//     },
//     yichu_zhiding_fanwei_yuansu: {
//         writable: !1,
//         enumerable: !1,
//         configurable: !0,
//         value: function (e, t) {
//             return this.splice(e, t);
//         }
//     },
//     yichu_zhiding_tiaojian_yuansu: {
//         writable: !1,
//         enumerable: !1,
//         configurable: !0,
//         value: function () {
//             var e = this.filter(match);
//             for (var t = 0; t < e.length; t++) {
//                 this.remove(e[t]);
//             }
//             return e;
//         }
//     },
//     contains: {
//         writable: !1,
//         enumerable: !1,
//         configurable: !0,
//         value: function (e) {
//             return this.indexOf(e) > -1;
//         }
//     },
//     distinct: {
//         writable: !1,
//         enumerable: !1,
//         configurable: !0,
//         value: function () {
//             return [].concat(new Set(this));
//         }
//     },
//     sum: {
//         writable: !1,
//         enumerable: !1,
//         configurable: !0,
//         value: function () {
//             var e = 0;
//             for (var t = 0; t < this.length; t++) {
//                 "number" == typeof this[t] ? (e += this[t]) : console.log("Tips: [" + this[t] + "] isn\\'t Number!");
//             }
//             return e;
//         }
//     },
//     upset: {
//         writable: !1,
//         enumerable: !1,
//         configurable: !0,
//         value: function () {
//             var e = this.length;
//             for (var t = 0; t < e - 1; t++) {
//                 var o = Math.floor(Math.random() * (e - t));
//                 var i = this[o];
//                 this[o] = this[e - t - 1];
//                 this[e - t - 1] = i;
//             }
//             return this;
//         }
//     },
//     huoqu_zuida_zhi: {
//         writable: !1,
//         enumerable: !1,
//         configurable: !0,
//         value: function () {
//             return Math.max.apply(null, this);
//         }
//     },
//     huoqu_zuixiao_zhi: {
//         writable: !1,
//         enumerable: !1,
//         configurable: !0,
//         value: function () {
//             return Math.min.apply(null, this);
//         }
//     }
// });
// Array.huoqu_bingji = function () {
//     var e = [];
//     var t = arguments.length;
//     var o = new Array(t);
//     for (var i = 0; i < t; i++) {
//         o[i] = arguments[i];
//     }
//     o.forEach(function (t) {
//         e = [].concat(e, t);
//     });
//     return [].concat(new Set(e));
// };
// Array.huoqu_jiaoji = function () {
//     var e = arguments.length;
//     var t = new Array(e);
//     for (var o = 0; o < e; o++) {
//         t[o] = arguments[o];
//     }
//     return t.reduce(function (e, t) {
//         return e.filter(function (e) {
//             return t.indexOf(e) >= 0;
//         });
//     });
// };
// Array.daluanShuzuShunxu = function (e) {
//     var t = e.slice();
//     var o = t.length;
//     for (var i = 0; i < o - 1; i++) {
//         var n = Math.floor(Math.random() * (o - i));
//         var a = t[n];
//         t[n] = t[o - i - 1];
//         t[o - i - 1] = a;
//     }
//     return t;
// };


Object.defineProperties(Array.prototype, {
    /**
     * 清空数组
     */
    clear: {
        writable: false,
        enumerable: false,
        configurable: true,
        value: function () {
            this.splice(0, this.length);
        }
    },
    /**
     * 克隆数组
     */
    clone: {
        writable: false,
        enumerable: false,
        configurable: true,
        value: function () {
            return this.slice();
        }
    },
    /**
     * 获取数组中的一个随机元素
     */
    huoqu_shuzu_zhong_suiji_yige_yuansu: {
        writable: false,
        enumerable: false,
        configurable: true,
        value: function () {
            return this[Math.get_random_int(0, this.length)];
        }
    },
    /**
     * 获取数组中随机的指定数量的元素
     * @param {number} count - 需要获取的数量
     */
    huoqu_shuzu_suiji_zhiding_shuliang_yuansu: {
        writable: false,
        enumerable: false,
        configurable: true,
        value: function (count) {
            if (count > this.length) {
                console.log("超出数组长度");
                return this;
            }
            let tempArr = this.slice(0);
            const result = [];
            for (let i = this.length - count; this.length > i; ) {
                const randomIndex = Math.floor((this.length + 1) * Math.random());
                [tempArr[randomIndex], tempArr[this.length]] = [tempArr[this.length], tempArr[randomIndex]];
                --this.length;
                result.push(tempArr.pop());
            }
            return result;
        }
    },
    /**
     * 获取数组中不重复的随机的指定数量的元素
     * @param {number} count - 需要获取的数量
     */
    huoqu_shuzu_suiji_zhiding_shuliang_buchongfu_yuansu: {
        writable: false,
        enumerable: false,
        configurable: true,
        value: function (count) {
            const tempArr = this.slice(0);
            const result = [];
            while (tempArr.length && result.length < count) {
                const randomIndex = Math.floor(Math.random() * tempArr.length);
                const element = tempArr.splice(randomIndex, 1)[0];
                if (!result.includes(element)) result.push(element);
            }
            if (result.length < count) console.log("未找到足够数量的元素");
            return result;
        }
    },
    /**
     * 获取数组中排除指定元素后的随机元素
     * @param {Array|any} except - 需排除的元素
     * @param {number} [count=1] - 需要获取的数量
     */
    paichu_zhiding_yuansu_hou_suiji_yuansu: {
        writable: false,
        enumerable: false,
        configurable: true,
        value: function (except, count = 1) {
            if (!Array.isArray(except)) {
                except = [except];
            }
            const filteredArr = this.filter(item => !except.includes(item));
            return count === 1 ? filteredArr.huoqu_shuzu_zhong_suiji_yige_yuansu() : filteredArr.huoqu_shuzu_suiji_zhiding_shuliang_yuansu(count);
        }
    },
    /**
     * 获取数组中排除指定索引后的随机元素
     * @param {Array|any} exceptIdx - 需排除的索引
     * @param {number} [count=1] - 需要获取的数量
     */
    paichu_zhiding_suoyin_hou_suiji_yuansu: {
        writable: false,
        enumerable: false,
        configurable: true,
        value: function (exceptIdx, count = 1) {
            if (!Array.isArray(exceptIdx)) {
                exceptIdx = [exceptIdx];
            }
            const filteredArr = this.filter((_, index) => !exceptIdx.includes(index));
            return count === 1 ? filteredArr.huoqu_shuzu_zhong_suiji_yige_yuansu() : filteredArr.huoqu_shuzu_suiji_zhiding_shuliang_yuansu(count);
        }
    },
    /**
     * 合并多个数组
     */
    hebing_duoge_shuzu: {
        writable: false,
        enumerable: false,
        configurable: true,
        value: function (...arrays) {
            return this.concat(...arrays);
        }
    },
    /**
     * 在指定位置插入元素
     * @param {number} index - 插入位置
     * @param {any} item - 插入的元素
     */
    insert: {
        writable: false,
        enumerable: false,
        configurable: true,
        value: function (index, item) {
            this.splice(index, 0, item);
        }
    },
    /**
     * 移除指定位置的元素
     * @param {number} index - 移除位置
     */
    removeAt: {
        writable: false,
        enumerable: false,
        configurable: true,
        value: function (index) {
            return this.splice(index, 1);
        }
    },
    /**
     * 移除指定元素
     */
    remove: {
        writable: false,
        enumerable: false,
        configurable: true,
        value: function (...items) {
            items.forEach(item => {
                const index = this.indexOf(item);
                if (index > -1) {
                    this.removeAt(index);
                }
            });
        }
    },
    /**
     * 移除指定范围的元素
     * @param {number} start - 起始位置
     * @param {number} count - 移除数量
     */
    yichu_zhiding_fanwei_yuansu: {
        writable: false,
        enumerable: false,
        configurable: true,
        value: function (start, count) {
            return this.splice(start, count);
        }
    },
    /**
     * 根据匹配条件移除元素
     * @param {function} match - 匹配函数
     */
    yichu_zhiding_tiaojian_yuansu: {
        writable: false,
        enumerable: false,
        configurable: true,
        value: function (match) {
            const matchedItems = this.filter(match);
            matchedItems.forEach(item => this.remove(item));
            return matchedItems;
        }
    },
    /**
     * 检查数组是否包含指定元素
     * @param {any} item - 检查的元素
     */
    contains: {
        writable: false,
        enumerable: false,
        configurable: true,
        value: function (item) {
            return this.indexOf(item) > -1;
        }
    },
    /**
     * 获取数组的不重复元素
     */
    distinct: {
        writable: false,
        enumerable: false,
        configurable: true,
        value: function () {
            return [...new Set(this)];
        }
    },
    /**
     * 求数组元素的和
     */
    sum: {
        writable: false,
        enumerable: false,
        configurable: true,
        value: function () {
            return this.reduce((acc, val) => {
                if (typeof val === 'number') {
                    return acc + val;
                } else {
                    console.log(`Tips: [${val}] isn't Number!`);
                    return acc;
                }
            }, 0);
        }
    },
    /**
     * 打乱数组顺序
     */
    upset: {
        writable: false,
        enumerable: false,
        configurable: true,
        value: function () {
            for (let i = this.length - 1; i > 0; i--) {
                const randomIndex = Math.floor(Math.random() * (i + 1));
                [this[i], this[randomIndex]] = [this[randomIndex], this[i]];
            }
            return this;
        }
    },
    /**
     * 获取数组中的最大值
     */
    huoqu_zuida_zhi: {
        writable: false,
        enumerable: false,
        configurable: true,
        value: function () {
            return Math.max(...this);
        }
    },
    /**
     * 获取数组中的最小值
     */
    huoqu_zuixiao_zhi: {
        writable: false,
        enumerable: false,
        configurable: true,
        value: function () {
            return Math.min(...this);
        }
    }
});

/**
 * 获取多个数组的并集
 */
Array.huoqu_bingji = function (...arrays) {
    return [...new Set(arrays.flat())];
};

/**
 * 获取多个数组的交集
 */
Array.huoqu_jiaoji = function (...arrays) {
    return arrays.reduce((acc, array) => acc.filter(item => array.includes(item)));
};

/**
 * 打乱数组
 * @param {Array} array - 需打乱的数组
 */
Array.daluanShuzuShunxu = function (array) {
    const shuffledArray = array.slice();
    for (let i = shuffledArray.length - 1; i > 0; i--) {
        const randomIndex = Math.floor(Math.random() * (i + 1));
        [shuffledArray[i], shuffledArray[randomIndex]] = [shuffledArray[randomIndex], shuffledArray[i]];
    }
    return shuffledArray;
};
